import {registerMicroApps, runAfterFirstMounted, setDefaultMountApp, start, initGlobalState} from 'qiankun';
import {store} from '@/store';

/**
 * @name 导入想传递给子应用的方法，其他类型的数据皆可按此方式传递
 * @description emit建议主要为提供子应用调用主应用方法的途径
 */
// import emits from "../utils/emit"


/**
 * @name 导入qiankun应用间通信机制appStore
 */
import appStore from '../utils/app-store';
/**
 * @name 导入全局常量给子应用
 */
import GLOBAL from '@/global';
import emits from '@/utils/emit';

/**
 * @name 声明子应用挂载dom，如果不需要做keep-alive，则只需要一个dom即可；
 */
const appContainer = '#subapp-viewport';

/**
 * @name 声明要传递给子应用的信息
 * @param data 主应要传递给子应用的数据类信息
 * @param emits 主应要传递给子应用的方法类信息
 * @param GLOBAL 主应要传递给子应用的全局常量
 * @param utils 主应要传递给子应用的工具类信息（只是一种方案）
 * @param components 主应要传递给子应用的组件类信息（只是一种方案）
 */

let props = {
    data: store.getters,
    emits,
    GLOBAL
};


/**
 * @name 启用qiankun微前端应用
 * @param {Array} list 应用注册表信息
 */


const qianKunStart = (list: []) => {
    /**
     * @name 处理子应用注册表数据
     */
    let apps: any = []; // 子应用数组盒子
    let defaultApp = null; // 默认注册应用路由前缀
    list.forEach((i: any) => {
        apps.push({
                      name: i.module,
                      entry: i.entry,
                      container: appContainer,
                      activeRule: i.routerBase,
                      props: {...props, routes: i.data, routerBase: i.routerBase}
                  });
        if (i.defaultRegister) {
            defaultApp = i.routerBase;
        }
    });

    // @ts-ignore
    // @ts-ignore
    /**
     * @name 注册子应用
     * @param {Array} list subApps
     */
    registerMicroApps(
        apps,
        {

            beforeLoad: [

                // @ts-ignore
                (app) => {
                    console.log('[LifeCycle] before load %c%s', 'color: green;', app.name);
                },
            ],
            beforeMount: [
                // @ts-ignore
                app => {
                    console.log('[LifeCycle] before mount %c%s', 'color: green;', app.name);
                },
            ],
            afterUnmount: [
                // @ts-ignore
                app => {
                    console.log('[LifeCycle] after unmount %c%s', 'color: green;', app.name);
                },
            ],
        },
    );

    /**
     * @name 设置默认进入的子应用
     * @param {String} 需要进入的子应用路由前缀
     */
    setDefaultMountApp(defaultApp + '/');

    /**
     * @name 启动微前端
     */
    start();

    /**
     * @name 微前端启动进入第一个子应用后回调函数
     */
    runAfterFirstMounted(() => {
    });

    /**
     * @name 启动qiankun应用间通信机制
     */
    appStore(initGlobalState);
};


export default qianKunStart;
